import os
import shutil
import datetime

def sync_recent_dirs(src_root, dst_root, excluded_files=None, days=7):
    """
    从 src_root 同步最近 days 天以内的数据目录到 dst_root
    :param src_root: 源目录 (如 \\192.168.1.12\data\ )
    :param dst_root: 目标目录 (如 E:\data )
    :param excluded_files: 要排除的文件名列表
    :param days: 同步最近多少天的数据
    """
    # 设置默认的排除文件列表
    if excluded_files is None:
        excluded_files = []
    
    today = datetime.datetime.today()
    cutoff = today - datetime.timedelta(days=days)

    if not os.path.exists(dst_root):
        os.makedirs(dst_root)

    # 遍历日期范围
    for i in range(days+1):
        d = today - datetime.timedelta(days=i)
        year = d.strftime("%Y")       # 2025
        year_month = d.strftime("%Y%m")  # 202509
        date_prefix = d.strftime("%Y%m%d")  # 20250925

        # 拼接路径
        src_month_path = os.path.join(src_root, year, year_month)
        dst_month_path = os.path.join(dst_root, year, year_month)

        if not os.path.exists(src_month_path):
            continue

        if not os.path.exists(dst_month_path):
            os.makedirs(dst_month_path)

        # 遍历当月目录下的日小时文件夹
        for entry in os.listdir(src_month_path):
            if entry.startswith(date_prefix) and entry.endswith(".D"):
                src_dir = os.path.join(src_month_path, entry)
                dst_dir = os.path.join(dst_month_path, entry)

                if not os.path.exists(dst_dir):
                    os.makedirs(dst_dir)

                for root, _, files in os.walk(src_dir):
                    rel_path = os.path.relpath(root, src_dir)
                    dst_subdir = os.path.join(dst_dir, rel_path)
                    if not os.path.exists(dst_subdir):
                        os.makedirs(dst_subdir)

                    for f in files:
                        # 检查文件是否在排除列表中
                        if f in excluded_files:
                            print(f"Skipped excluded file: {os.path.join(root, f)}")
                            continue
                            
                        src_file = os.path.join(root, f)
                        dst_file = os.path.join(dst_subdir, f)

                        # 判断是否需要复制
                        if not os.path.exists(dst_file) or \
                           os.path.getsize(src_file) != os.path.getsize(dst_file) or \
                           os.path.getmtime(src_file) > os.path.getmtime(dst_file):
                            shutil.copy2(src_file, dst_file)
                            print(f"Copied: {src_file} -> {dst_file}")


# 示例使用
src = r"\\192.168.1.12\data"
dst = r"D:\data"

# 定义要排除的文件列表
excluded_list = ["TEMPDAT"]

# 调用函数，传入排除列表
sync_recent_dirs(src, dst, excluded_files=excluded_list, days=7)

# 也可以不传入排除列表，使用默认的空列表
# sync_recent_dirs(src, dst, days=7)